﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms
{
    public partial class frmArticuloVentaBuscar : Form
    {
        DisancoEntities context;
        Articulos articuloSeleccionado;

        int cantidad;
        decimal precioOferta;
        decimal precioOfertaFinal;
        decimal precioBonificado;
        decimal precioTotal;
        bool conOferta;

        Font fuenteNormal = new Font("Calibri", 11, FontStyle.Regular);
        Font fuenteNegrita = new Font("Calibri", 11, FontStyle.Bold);

        public frmArticuloVentaBuscar()
        {
            InitializeComponent();
            context = new DisancoEntities();

            cmbCategorias.SelectedIndex = 0;

            dgvArticulos.AutoGenerateColumns = false;
            dgvOfertas.AutoGenerateColumns = false;

            cargarArticulos();
        }

        public decimal PrecioTotal
        {
            get { return precioTotal; }
        }

        public decimal PrecioUnitario
        {
            get
            {
                if (conOferta)
                    return precioOfertaFinal;
                else
                    return precioBonificado;
            }
        }

        public int Cantidad
        {
            get { return cantidad; }
        }

        public int Articulo
        {
            get { return articuloSeleccionado.art_id; }
        }

        private void cargarArticulos()
        {
            try
            {
                context = new DisancoEntities();
                dgvArticulos.DataSource = context.VistaArticulos;
                dgvOfertas.DataSource = null;

                numCantidad.Minimum = 0;
                numCantidad.Value = 0;
                numCantidad.ReadOnly = true;

                lblPrecioBonificado.Font = fuenteNormal;
                lblPrecioOfertaFinal.Font = fuenteNormal;
                lblPrecioTotal.Font = fuenteNormal;

                txbPrecioBonificado.Text = "";
                txbPrecioOferta.Text = "";
                txbPrecioOfertaFinal.Text = "";
                txbPrecioTotal.Text = "";

                btnAgregar.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void cargarArticuloSeleccionado()
        {
            int art_id = (int)dgvArticulos.CurrentRow.Cells["art_id"].Value;
            articuloSeleccionado = context.Articulos.FirstOrDefault(a => a.art_id == art_id);

            if (articuloSeleccionado != null)
            {
                //Blanqueo la lista
                for (int i = 0; i < dgvArticulos.Rows.Count; i++)
                {
                    dgvArticulos.Rows[i].DefaultCellStyle.BackColor = SystemColors.Window;
                    dgvArticulos.Rows[i].DefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
                }
                //Resalto el articulo seleccionado
                dgvArticulos.CurrentRow.DefaultCellStyle.BackColor = Color.Green;
                dgvArticulos.CurrentRow.DefaultCellStyle.SelectionBackColor = Color.DarkGreen;

                numCantidad.Maximum = articuloSeleccionado.art_stock;

                if (articuloSeleccionado.art_stock > 0)
                {
                    numCantidad.Minimum = 1;
                    numCantidad.Value = 1;                    
                    numCantidad.ReadOnly = false;

                    btnAgregar.Enabled = true;
                }
                else
                {
                    numCantidad.Minimum = 0;
                    numCantidad.Value = 0;
                    numCantidad.ReadOnly = true;

                    btnAgregar.Enabled = false;
                }

                precioBonificado = Convert.ToDecimal(articuloSeleccionado.art_precio_bonificado);
                precioBonificado = Math.Round(precioBonificado, 2);

                txbPrecioBonificado.Text = precioBonificado.ToString();

                cargarOfertas();
                calcularPrecioFinal();
            }
        }

        private void cargarOfertas()
        {
            if (articuloSeleccionado.art_precio_oferta != 0)
            {
                dgvOfertas.DataSource = articuloSeleccionado.OfertasxArticulo;

                precioOferta = articuloSeleccionado.art_precio_oferta;
                conOferta = true;

                txbPrecioOferta.Text = precioOferta.ToString();

                lblPrecioOfertaFinal.Font = fuenteNegrita;
                lblPrecioBonificado.Font = fuenteNormal;
            }
            else
            {
                dgvOfertas.DataSource = null;

                precioOferta = 0;
                precioOfertaFinal = 0;
                conOferta = false;

                txbPrecioOferta.Text = "";
                txbPrecioOfertaFinal.Text = "";

                lblPrecioBonificado.Font = fuenteNegrita;
                lblPrecioOfertaFinal.Font = fuenteNormal;
            }
        }

        void calcularPrecioFinal()
        {
            cantidad = Convert.ToInt32(numCantidad.Value);

            if (conOferta)
            {
                //Busco todas las ofertas que puedo aplicar
                var query = (from of in articuloSeleccionado.OfertasxArticulo
                            where of.oferta_cantidad <= cantidad
                            select of).OrderByDescending(t => t.oferta_cantidad);

                //La primera de la lista deberia ser la mejor
                OfertasxArticulo mejorOferta = query.FirstOrDefault();

                //Si no hay ofertas q se apliquen, solo tomo el precio oferta tal cual esta
                if (mejorOferta != null)
                {
                    precioOfertaFinal = Math.Round(precioOferta / (1 + mejorOferta.oferta_descuento), 2);

                    foreach (DataGridViewRow fila in dgvOfertas.Rows)
                    {
                        if ((int)fila.Cells["oferta_id"].Value == mejorOferta.oferta_id)
                        {
                            fila.DefaultCellStyle.BackColor = Color.Green;
                            fila.DefaultCellStyle.SelectionBackColor = Color.Green;
                        }
                        else
                        {
                            fila.DefaultCellStyle.BackColor = SystemColors.Window;
                            fila.DefaultCellStyle.SelectionBackColor = SystemColors.Window;
                        }
                    }
                }
                else
                {
                    precioOfertaFinal = precioOferta;
                }

                txbPrecioOfertaFinal.Text = precioOfertaFinal.ToString();
                
                precioTotal = precioOfertaFinal * cantidad;
            }
            else
            {
                precioTotal = precioBonificado * cantidad;
            }

            txbPrecioTotal.Text = precioTotal.ToString();
            lblPrecioTotal.Font = fuenteNegrita;
        }
        //
        //Eventos
        //
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                context = new DisancoEntities();

                IEnumerable<VistaArticulos> query;
                string cadena = txbBuscar.Text;
                string tipo_busqueda = (string)cmbCategorias.SelectedItem;

                switch (tipo_busqueda)
                {
                    case "Nombre del proveedor":
                        {
                            query = from vista in context.VistaArticulos
                                    join prov_art in context.ProveedoresxArticulos on vista.art_id equals prov_art.art_id
                                    where prov_art.Proveedores.prov_nombre.Contains(cadena)
                                    select vista;
                            break;
                        }
                    case "Categoria":
                        {
                            query = from vista in context.VistaArticulos
                                    where vista.categ_nombre.Contains(cadena)
                                    select vista;
                            break;
                        }
                    case "Rubro":
                        {
                            query = from vista in context.VistaArticulos
                                    join art in context.Articulos on vista.art_id equals art.art_id
                                    where art.Categorias.Rubros.rubro_nombre.Contains(cadena)
                                    select vista;
                            break;
                        }
                    default:
                        {
                            query = from vista in context.VistaArticulos
                                    where vista.art_nombre.Contains(txbBuscar.Text)
                                    select vista;
                            break;
                        }
                }

                dgvArticulos.DataSource = query;

                cargarArticuloSeleccionado();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
     }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void numCantidad_ValueChanged(object sender, EventArgs e)
        {
            if (articuloSeleccionado != null)
            {
                calcularPrecioFinal();
            }
        }

        private void dgvArticulos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            cargarArticuloSeleccionado();
        }

        private void dgvArticulos_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                cargarArticuloSeleccionado();
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            cargarArticulos();
        }
    }
}